www.gusucode.com > VC 2D游戏编辑器-源码程序 > VC 2D游戏编辑器-源码程序/code/game_Source/GameLib/script/script.cpp

    //Download by http://www.NewXing.com
#include "script.h"
#include "..\\..\\newgame.h"
#include "..\\..\\main.h"

void CALLBACK ScriptTimer(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime);
int  iTimerId;
bool bNewTime = false;

CScript::CScript(int id, char * cName, char *FILENAME)
{
	LoadNewScript(id , cName, FILENAME);
}

CScript::CScript( )
{
	Script = NULL;
	cScriptName[0] = '\0';
	iExplainResult = -1;
	iPosition = 0;
	IsAgain = false;
}

CScript::~CScript( )
{
	PA_SAFE_DELETE(Script);
	cScriptName[0] = '\0';
}

void CScript::Destroy( )
{
	PA_SAFE_DELETE(Script);
	cScriptName[0] = '\0';
}

void CScript::Run( )
{
	if( iScriptID == 0xffff && !IsAgain )
	{
		KillTimer(hwnd, 1);
		bNewTime = false;
	}
	while(iPosition < (int)ScriptHeader.nScriptN)
	{
		Explain( );
		switch(iExplainResult)
		{
		case 0xffff:
		case 0xeeee:
			Destroy( );
			NewGameSelect = 99 ;	//退出游戏
			NewGameOut = true;
			return;
			break;
		case 0xdddd:
			if( (iScriptID == 0xffff) && !bNewTime )
			{
				SetTimer(hwnd, 1, 50, NewGameTimer);
				bNewTime = true;
			}
			return;
			break;
		}
		iPosition ++;
	}
	if(iPosition == (int)ScriptHeader.nScriptN)
	{
		if(iScriptID == 0xffff)
			SetTimer(hwnd, 1, 50, NewGameTimer);
		Destroy( );
	}
}

void CScript::Pause( )
{
	iExplainResult = 0xdddd;
}

void CScript::Restart( )
{
	iPosition = 0;
	iExplainResult = -1;
	IsAgain = false;
	Run( );
}

bool CScript::LoadNewScript(int id, char * cName, char *FILENAME)
{
	if(Script != NULL)
	{
		PA_SAFE_DELETE(Script);
	}
	FILE *file=fopen(FILENAME,"rb");
	if(!file)
	{
		MsgBox("不能打开脚本文件!%s",FILENAME);
		return false;
	}
	
	fread((char *)&ScriptHeader, sizeof(_ScriptHeader), 1, file);
	Script = new _Script[ScriptHeader.nScriptN];

	fread((char *)Script, ScriptHeader.nScriptN*sizeof(_Script), 1, file);
	fclose(file);
	iPosition = 0;
	iScriptID = id;
	iExplainResult = -1;
	IsAgain = false;
	strcpy(cScriptName, cName);
	return true;
}

bool CScript::LoadScript()
{
	if(cScriptName[0] == '\0')
		return false;
	char	cScript_Path[MAX_PATH];
	strcpy(cScript_Path, "Resource\\script\\");
	strcat(cScript_Path, cScriptName);
	if(Script != NULL)
	{
		PA_SAFE_DELETE(Script);
	}
	FILE *file=fopen(cScript_Path,"rb");
	if(!file)
	{
		MsgBox("不能打开脚本文件!%s",cScript_Path);
		return false;
	}
	
	fread((char *)&ScriptHeader, sizeof(_ScriptHeader), 1, file);
	Script = new _Script[ScriptHeader.nScriptN];

	fread((char *)Script, ScriptHeader.nScriptN*sizeof(_Script), 1, file);
	fclose(file);
	iExplainResult = -1;
	IsAgain = false;
	return true;
}

void CScript::GetParameter(char *str, int iNumber)
{
	int i, j, k;
	k = 0;
	for(i = 0; i < iNumber; i++)
	{
		j = 0;
		while((str[k] != NULL)&&((str[k] != '@')||(str[k+1] != '@')))
		{
			cParameter[i][j] = str[k];
			j++;
			k++;
		}
		k += 2;
		cParameter[i][j] = '\0';
	}
}

void CScript::Explain( )
{
	int		i, j, m, x, y, time, iSize, iWeight;
	int		pmr1, pmr2, iEvent;
	bool	bBool;
	RECT	rect;
	DWORD	dColor;
	bool	IsTrue = false;
	char *	pParameter;
	char	cScript_Path[MAX_PATH];
	HDC		hdc;
	CFont	cFont;
	iExplainResult = -1;
	switch(Script[iPosition].wKeyId)
	{
	case 0:
		i = 0;
		while(i != (int)ScriptHeader.nScriptN) 
		{
			if(Script[i].wKeyId == 65535)
			{
				if(!strcmp((char *)Script[iPosition].wParameter, (char *)Script[i].wParameter))
				{
					iPosition = i+1;
					break;
				}
			}
			i++;
		}
		if(i == (int)ScriptHeader.nScriptN)
		{
			MsgBox("脚本出错!");
			iExplainResult = 0xffff;
		}
		break;
	case 1:
		m = 0;
		pParameter = (char *)Script[iPosition].wParameter;
		while((pParameter[0] != '@')||(pParameter[1] != '@'))
		{
			IsTrue = false;
			pmr1 = (* parameter[Script[iPosition].wParameter[m]]);
			if(Script[iPosition].wParameter[m+2]&0x8000)
				pmr2 = Script[iPosition].wParameter[m+2]&0x7fff;		//是常量
			else
				pmr2 = (* parameter[Script[iPosition].wParameter[m+2]]);	//是变量

			switch(Script[iPosition].wParameter[m+1])
			{
			case 0:				//!=
				if(pmr1 != pmr2)
					IsTrue = true;
				else
					IsTrue = false;
				break;
			case 1:				//>
				if(pmr1 > pmr2)
					IsTrue = true;
				else
					IsTrue = false;
				break;
			case 2:				//>=
				if(pmr1 >= pmr2)
					IsTrue = true;
				else
					IsTrue = false;
				break;
			case 3:				//=
				if(pmr1 == pmr2)
					IsTrue = true;
				else
					IsTrue = false;
				break;
			case 4:				//<=	
				if(pmr1 <= pmr2)
					IsTrue = true;
				else
					IsTrue = false;
				break;
			case 5:				//<
				if(pmr1 < pmr2)
					IsTrue = true;
				else
					IsTrue = false;
				break;
			default:
				IsTrue = false;
			}
			if(!IsTrue)
				break;
			m += 3;
			pParameter = (char *)&Script[iPosition].wParameter[m];
		}
		if(IsTrue)
		{
			i = 0;
			while(i != (int)ScriptHeader.nScriptN) 
			{
				if(Script[i].wKeyId == 0xffff)
				{
					if(!strcmp((char *)&(Script[iPosition].wParameter[m+1]), (char *)Script[i].wParameter))
					{
						iPosition = i+1;
						break;
					}
				}
				i++;
			}
			if(i == (int)ScriptHeader.nScriptN)
			{
				MsgBox("脚本出错!");
				iExplainResult = 0xffff;
			}

		}
		else
		{
			iExplainResult = 0x0001;
		}
		break;
	case 2:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		strcpy(cScript_Path, "Resource\\script\\");
		strcat(cScript_Path, cParameter[0]);
		m = atoi(cParameter[1]);
		for(i = 0; i < 10; i++)
			if(Script_Child[i].Script == NULL)
			{
				Script_Child[i].LoadNewScript(m, cParameter[0], cScript_Path);
				Script_Child[i].iId = i;
				break;
			}
		if(i == 10)
		{
			MsgBox("脚本子文件过多!");
			iExplainResult = 0xffff;
		}
		break;
	case 3:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = 0;
		while(i != 10) 
		{
			if(!strcmp(cParameter[0], (char *)Script_Child[i].cScriptName))
			{
				Script_Child[i].Run();
				switch(Script_Child[i].iExplainResult)
				{
				case 0xffff:
					iExplainResult = 0xffff;
					break;
				case 0xeeee:
					iExplainResult = 0xeeee;
					break;
				case 0xdddd:
					iExplainResult = 0xdddd;
					break;
				}
				break;
			}
			i++;
		}
		if(i == 10)
		{
			MsgBox("脚本出错!");
			iExplainResult = 0xffff;
		}
		break;
	case 4:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		if(!strcmp(cParameter[0], "this"))
		{
			Restart( );
		}
		else
		{
			i = 0;
			while(i != 10) 
			{
				if(!strcmp(cParameter[0], (char *)Script_Child[i].cScriptName))
				{
					Script_Child[i].Restart();
					switch(Script_Child[i].iExplainResult)
					{
					case 0xffff:
						iExplainResult = 0xffff;
						break;
					case 0xeeee:
						iExplainResult = 0xeeee;
						break;
					case 0x1111:
						iExplainResult = 0x1111;
						break;
					}
					break;
				}
				i++;
			}
			if(i == 10)
			{
				MsgBox("脚本出错!");
				iExplainResult = 0xffff;
			}
		}
		break;
	case 10:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		x = atoi(cParameter[0]);
		y = atoi(cParameter[1]);
		iSize = atoi(cParameter[2]);
		iWeight = atoi(cParameter[3]);
		dColor	= (cParameter[4][0]|(cParameter[4][1]<<8)|(cParameter[4][2]<<16))&0xffffff;
		rect.left = x-30;
		if(rect.left < 0)
			rect.left = 0;
		rect.top = y-30;
		if(rect.top < 0)
			rect.top = 0;
		rect.right = rect.left + strlen(cParameter[5])*iSize/2+90;
		if(rect.right > SCREEN_WIDTH)
			rect.right = SCREEN_WIDTH -1;
		rect.bottom = rect.top + iSize+60;
		if(rect.bottom > SCREEN_HEIGHT)
			rect.bottom = SCREEN_HEIGHT-1;
		ImageAlpha(rect.left, rect.top, rect, pS[SBuffer], pS[SBuffer], SP[SBuffer], SP[SBuffer], 16, false, 0);
		DDS[SBuffer]->GetDC(&hdc);
		cFont.UseFont(hdc,DCF_USERDEFINE, iSize, iWeight);
		ShowText(hdc, x, y, dColor, cParameter[5]);
		cFont.RestoreFont(hdc);
		DDS[SBuffer]->ReleaseDC(hdc);
		UpdateScreen();
		break;
	case 13:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		int pmr;
		if(Script[iPosition].wParameter[2]&0x8000)
			pmr = Script[iPosition].wParameter[2]&0x7fff;		//是常量
		else
			pmr = * parameter[Script[iPosition].wParameter[2]];	//是变量
		* parameter[Script[iPosition].wParameter[0]] = pmr;
		break;
	case 19:
		strcpy(cScript_Path, "sound\\");
		strcat(cScript_Path, (char *)Script[iPosition].wParameter);
		mainMusic->LoadMusic(cScript_Path);
		break;
	case 20:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		time = atoi(cParameter[0]);
		mainMusic->Play(time);
		break;
	case 21:
		mainMusic->Stop();
		break;
	case 22:
		mainMusic->Pause();
		break;
	case 23:
		mainMusic->Resume();
		break;
	case 24:
		strcpy(cScript_Path, "sound\\");
		strcat(cScript_Path, (char *)Script[iPosition].wParameter);
		mainSound->LoadSound(cScript_Path);
		break;
	case 25:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		time = atoi(cParameter[0]);
		mainSound->Play(time);
		break;
	case 26:
		mainSound->Stop();
		break;
	case 30:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		time = atoi(cParameter[0]);
		Delay(time);
		break;
	case 31:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		rect.left = atoi(cParameter[1]);
		rect.top = atoi(cParameter[2]);
		rect.right = atoi(cParameter[3]);
		rect.bottom = atoi(cParameter[4]);
		time = atoi(cParameter[5]);
		FadeIn(i, rect, time);
		break;
	case 32:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		rect.left = atoi(cParameter[1]);
		rect.top = atoi(cParameter[2]);
		rect.right = atoi(cParameter[3]);
		rect.bottom = atoi(cParameter[4]);
		time = atoi(cParameter[5]);
		FadeOut(i, rect, time);
		break;
	case 40:
		GameStatus = GAME_NORMAL;
		break;
	case 41:
		GameStatus = GAME_PAUSE;
		break;
	case 47:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		if(!strcmp(cParameter[0], "this"))
		{
			Pause( );
			iPosition++;
		}
		else
		{
			i = 0;
			while(i != 10) 
			{
				if(!strcmp(cParameter[0], (char *)Script_Child[i].cScriptName))
				{
					Script_Child[i].Pause();
					break;
				}
				i++;
			}
			if(i == 10)
			{
				MsgBox("脚本出错!");
				iExplainResult = 0xffff;
			}
		}
		break;
	case 48:
		iExplainResult = 0x1111;
		break;
	case 49:
		iExplainResult = 0xeeee;
		break;
	case 50:
		strcpy(cScript_Path, "map\\");
		strcat(cScript_Path, (char *)Script[iPosition].wParameter);
		for(i = 0; i < 9; i++)
			if(Map_Child[i].pSurfaceData == NULL)
			{
				Map_Child[i].LoadMap(i, (char *)Script[iPosition].wParameter, cScript_Path);
				break;
			}
		if(i == 10)
		{
			MsgBox("地图文件过多!");
			iExplainResult = 0xffff;
		}
		break;
	case 52:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		x = atoi(cParameter[0]);
		y = atoi(cParameter[1]);
		bBool = (bool)(atoi(cParameter[2]));
		Map->pSurfaceData[y*Map->pHeader.nWidth+x].nUseTranSition = bBool;
		break;
	case 53:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		x = atoi(cParameter[0]);
		y = atoi(cParameter[1]);
		iEvent = atoi(cParameter[2]);
		Map->pSurfaceData[y*Map->pHeader.nWidth+x].nEvent = iEvent;
		break;
	case 56:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		x = atoi(cParameter[0]);
		y = atoi(cParameter[1]);
		pmr1 = atoi(cParameter[2]);
		pmr2 = atoi(cParameter[3]);
		i = atoi(cParameter[4]);
		Map->ChangeObjPosition(x, y, pmr1, pmr2, i);
		break;
	case 57:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		x = atoi(cParameter[0]);
		y = atoi(cParameter[1]);
		i = atoi(cParameter[2]);
		bBool = (bool)(atoi(cParameter[3]));
		Map->pSurfaceData[y*Map->pHeader.nWidth+x].nID = i;
		Map->pSurfaceData[y*Map->pHeader.nWidth+x].nUseTranSition = bBool;
		break;
	case 58:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		x = atoi(cParameter[0]);
		y = atoi(cParameter[1]);
		pmr1 = atoi(cParameter[2]);
		pmr2 = atoi(cParameter[3]);
		i = atoi(cParameter[4]);
		Map->ChangeObjID(x, y, pmr1, pmr2, i);
		break;
	case 59:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		x = atoi(cParameter[0]);
		y = atoi(cParameter[1]);
		m = atoi(cParameter[2]);
		if(dMap_StartX < x)
		{
			pmr1 = 1;
		}
		else
		{
			pmr1 = -1;
		}
		if(dMap_StartY < y)
		{
			pmr2 = 1;
		}
		else 
		{
			pmr2 = -1;
		}
		i = dMap_StartX;
		j = dMap_StartY;
		while((abs(i - x) > m)||(abs(j - y) > m))
		{
			dMap_StartX = i;
			dMap_StartY = j;
			FreshTheMap(Map, i, j);
			UpdateScreen();
			if(abs(i - x) > m)
				i += pmr1*m;
			if(abs(j - y) > m)
				j += pmr2*m;
			if(j > 1340)
				bBool = true;
		}
		dMap_StartX = atoi(cParameter[0]);
		dMap_StartY = atoi(cParameter[1]);
		FreshTheMap(Map, i, j);
		break;
	case 60:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		x = atoi(cParameter[0]);
		y = atoi(cParameter[1]);
		pmr1 = atoi(cParameter[2]);
		pmr2 = atoi(cParameter[3]);
		pParameter = cParameter[4];
		i = 0;
		while(i != 9) 
		{
			if(!strcmp(pParameter, (char *)Map_Child[i].cMapName))
			{
				FreshTheMap(Map_Child, pmr1, pmr2);
				break;
			}
			i++;
		}
		if(i == 9)
		{
			MsgBox("脚本出错!");
			iExplainResult = 0xffff;
		}
		break;
	case 61:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		x = atoi(cParameter[0]);
		y = atoi(cParameter[1]);
		dMap_StartX = x;
		dMap_StartY = y;
		FreshTheMap(Map, x, y);
		break;
	case 62:
		UpdateScreen();
		break;
	case 70:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		pParameter = cParameter[0];
		i = 0;
		while(i != 9) 
		{
			if(!strcmp(pParameter, (char *)Map_Child[i].cMapName))
			{
				Map = &Map_Child[i];
				break;
			}
			i++;
		}
		if(i == 9)
		{
			MsgBox("脚本出错!");
			iExplainResult = 0xffff;
		}
		break;
	case 100:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		role->level = i;
		break;
	case 101:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		x = atoi(cParameter[0]);
		y = atoi(cParameter[1]);
		role->dx = role->x = x;
		role->dy = role->y = y;
		FreshTheMap(Map, dMap_StartX, dMap_StartY);
		break;
	case 102:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		role->v = i;
		break;
	case 103:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		role->speed = i;
		break;
	case 104:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		role->health = i;
		break;
	case 105:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		role->MaxHealth = i;
		break;
	case 106:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		role->vigor = i;
		break;
	case 107:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		role->MaxVigor = i;
		break;
	case 108:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		role->energy = i;
		break;
	case 109:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		role->MaxEnergy = i;
		break;
	case 110:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		role->defend = i;
		break;
	case 111:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		role->attack = i;
		break;
	case 112:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		role->agility = i;
		break;
	case 113:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		role->FollowID = i;
		break;
	case 114:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		role->Bmoney = i;
		break;
	case 115:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		role->Smoney = i;
		break;
	case 116:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		role->experiment = i;
		break;
	case 117:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		role->MaxExperiment = i;
		break;
	case 118:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		x = atoi(cParameter[0]);
		i = atoi(cParameter[1]);
		m = atoi(cParameter[2]);
		role->skill[x].id = i;
		role->skill[x].level = m;
		break;
	case 119:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		x = atoi(cParameter[0]);
		i = atoi(cParameter[1]);
		m = atoi(cParameter[2]);
		role->medica_goods[x].id = i;
		role->medica_goods[x].iNumber = m;
		break;
	case 120:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		x = atoi(cParameter[0]);
		i = atoi(cParameter[1]);
		role->equiped[x] = i;
		break;
	case 121:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		role->face = i;
		role->show();
		FreshTheMap(Map, dMap_StartX, dMap_StartY);
		break;
	case 130:
		if(!IsAgain)
		{
			GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
			x = atoi(cParameter[0]);
			y = atoi(cParameter[1]);
			m = atoi(cParameter[2]);
			sprintf(cParameter[3], "%d", role->speed);
			role->speed = m;
			role->moveto(x, y);
			IsAgain = true;
			Pause( );
			if(iScriptID != 0xffff)
			{
				iTimerId = iId;
				SetTimer(hwnd, 9, 50, ScriptTimer);
			}	
			break;
		}
		else if((role->WalkNumber != -1)||(role->FootStatus != -1))
		{
			Pause( );
			break;
		}
		if(iScriptID != 0xffff)
			KillTimer(hwnd, 9);
		role->speed = atoi(cParameter[3]);
		IsAgain = false;
		iExplainResult = -1;
		break;
	case 141:
		if(!IsAgain)
		{
			GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
			x = atoi(cParameter[0]);
			y = atoi(cParameter[1]);
			i = atoi(cParameter[2]);
			role->Waittime = magicRLE_user->bfWidthBitN;
			role->MagicUsing.id = i;
			role->MagicUsing.x  = x;
			role->MagicUsing.y  = y;
			role->MagicUsing.n  = 0;
			role->MagicUsing.owner = TMain;
			role->MagicUsing.IsMagicShowing = false;
			role->MagicUsing.life = magicRLE[i]->bfWidthBitN;
			role->MagicUsing.Back = NULL;
			IsAgain = true;
			Pause( );
			if(iScriptID != 0xffff)
			{
				iTimerId = iId;
				SetTimer(hwnd, 9, 50, ScriptTimer);
			}
			role->faceto(x, y);
			break;
		}
		else if(role->Waittime != 0)
		{
			Pause( );
			break;
		}
		if(iScriptID != 0xffff)
			KillTimer(hwnd, 9);
		IsAgain = false;
		iExplainResult = -1;
		break;
	case 142:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		x = atoi(cParameter[0]);
		i = atoi(cParameter[1]);
		while(i > 0)
		{
			Goods->UseGoods(role, 1, x);
			i --;
		}
		break;
	case 143:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		x = role->x;
		y = role->y;
		DDS[SBuffer]->GetDC(&hdc);
		cFont.UseFont(hdc,DCF_NOMAL);
		ShowText(hdc, x, y, RGB(255,255,255), cParameter[0]);
		cFont.RestoreFont(hdc);
		DDS[SBuffer]->ReleaseDC(hdc);
		UpdateScreen();
		break;
	case 150:
		strcpy(cScript_Path, "map\\");
		strcat(cScript_Path, (char *)Script[iPosition].wParameter);
		if(Zoetic != NULL)
			P_SAFE_DELETE(Zoetic);
		Zoetic = new CZoetic(0, (char *)Script[iPosition].wParameter, cScript_Path);
		break;
	case 151:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		Zoetic->MainStatus[i] = m;
		FreshTheMap(Map, dMap_StartX, dMap_StartY);
		break;
	case 152:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		strcpy((char *)Zoetic->ZoeticLink[i].dName, cParameter[1]);
		break;
	case 153:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		Zoetic->ZoeticLink[i].dType = m;
		break;
	case 154:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		Zoetic->ZoeticLink[i].dPicN = m;
		FreshTheMap(Map, dMap_StartX, dMap_StartY);
		break;
	case 155:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		x = atoi(cParameter[1]);
		y = atoi(cParameter[2]);
		Zoetic->ZoeticLink[i].x = x;
		Zoetic->ZoeticLink[i].y = y;
		break;
	case 156:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		x = atoi(cParameter[1]);
		y = atoi(cParameter[2]);
		Zoetic->ZoeticLink[i].dCurrent_x = Zoetic->dx[i] = x;
		Zoetic->ZoeticLink[i].dCurrent_y = Zoetic->dy[i] = y;
		FreshTheMap(Map, dMap_StartX, dMap_StartY);
		break;
	case 157:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		Zoetic->ZoeticLink[i].dArea = m;
		break;
	case 158:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		Zoetic->ZoeticLink[i].dEvent = m;
		break;
	case 159:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		Zoetic->ZoeticLink[i].dCharacter = m;
		break;
	case 160:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		Zoetic->ZoeticLink[i].v = m;
		break;
	case 161:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		Zoetic->ZoeticLink[i].speed = m;
		break;
	case 162:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		Zoetic->ZoeticLink[i].health= m;
		break;
	case 163:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		Zoetic->ZoeticLink[i].MaxHealth = m;
		break;
	case 164:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		Zoetic->ZoeticLink[i].vigor = m;
		break;
	case 165:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		Zoetic->ZoeticLink[i].MaxVigor = m;
		break;
	case 166:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		Zoetic->ZoeticLink[i].energy = m;
		break;
	case 167:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		Zoetic->ZoeticLink[i].MaxEnergy = m;
		break;
	case 168:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		Zoetic->ZoeticLink[i].defend = m;
		break;
	case 169:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		Zoetic->ZoeticLink[i].attack = m;
		break;
	case 170:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		Zoetic->ZoeticLink[i].agility = m;
		break;
	case 171:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		Zoetic->ZoeticLink[i].FollowID = m;
		break;
	case 172:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		Zoetic->ZoeticLink[i].Bmoney = m;
		break;
	case 173:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		Zoetic->ZoeticLink[i].experiment = m;
		break;
	case 174:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		Zoetic->ZoeticLink[i].MaxExperiment = m;
		break;
	case 175:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		x = atoi(cParameter[2]);
		y = atoi(cParameter[3]);
		Zoetic->ZoeticLink[i].skill[m].id = x;
		Zoetic->ZoeticLink[i].skill[m].level = y;
		break;
	case 176:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		x = atoi(cParameter[2]);
		y = atoi(cParameter[3]);
		Zoetic->ZoeticLink[i].medica_goods[m].id = x;
		Zoetic->ZoeticLink[i].medica_goods[m].iNumber = y;
		break;
	case 177:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		x = atoi(cParameter[2]);
		Zoetic->ZoeticLink[i].equiped[m] = x;
		break;
	case 178:
		if(!IsAgain)
		{
			GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
			i = atoi(cParameter[0]);
			x = atoi(cParameter[1]);
			y = atoi(cParameter[2]);
			m = atoi(cParameter[3]);
			sprintf(cParameter[4], "%d", Zoetic->ZoeticLink[i].speed);
			Zoetic->MovetoI(i, x, y);
			IsAgain = true;
			Pause();
			if(iScriptID != 0xffff)
			{
				iTimerId = iId;
				SetTimer(hwnd, 9, 50, ScriptTimer);
			}
			break;
		}
		else if((Zoetic->WalkNumber[atoi(cParameter[0])] != -1)||(Zoetic->FootStatus[atoi(cParameter[0])] != -1))
		{
			Pause( );
			break;
		}
		if(iScriptID != 0xffff)
			KillTimer(hwnd, 9);
		Zoetic->ZoeticLink[atoi(cParameter[0])].speed = atoi(cParameter[4]);
		IsAgain = false;
		iExplainResult = -1;
		break;
	case 179:
		if(!IsAgain)
		{
			GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
			i = atoi(cParameter[0]);
			m = atoi(cParameter[1]);
			x = atoi(cParameter[2]);
			y = atoi(cParameter[3]);
			for(j = 0; j < (int)Zoetic->ZoeticHeader.nMagicN; j++)
			{
				if(Zoetic->ZoeticLink[j].dID == i)
					break;
			}
			if(j == (int)Zoetic->ZoeticHeader.nMagicN)
				break;
			Fire(j, x, y, m);
			Pause();
			IsAgain = true;
			if(iScriptID != 0xffff)
			{
				iTimerId = iId;
				SetTimer(hwnd, 9, 50, ScriptTimer);
			}	
			break;
		}
		else if(Zoetic->Waittime[atoi(cParameter[0])] != -1)
		{
			Pause();
			break;
		}
		if(iScriptID != 0xffff)
			KillTimer(hwnd, 9);
		IsAgain = false;
		iExplainResult = -1;
		break;
	case 180:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		m = atoi(cParameter[1]);
		x = atoi(cParameter[2]);
		while(x > 0)
		{
			Goods->UseGoods(i, 1, m);
			x --;
		}
		break;
	case 181:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		for(j = 0; j < (int)Zoetic->ZoeticHeader.nMagicN; j++)
		{
			if(Zoetic->ZoeticLink[j].dID == i)
				break;
		}
		if(j == (int)Zoetic->ZoeticHeader.nMagicN)
			break;
		x = Zoetic->ZoeticLink[j].dCurrent_x;
		y = Zoetic->ZoeticLink[j].dCurrent_y;
		DDS[SBuffer]->GetDC(&hdc);
		cFont.UseFont(hdc,DCF_NOMAL);
		ShowText(hdc, x, y, RGB(255,255,0), cParameter[1]);
		cFont.RestoreFont(hdc);
		DDS[SBuffer]->ReleaseDC(hdc);
		UpdateScreen();
		break;
	case 182:
		GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
		i = atoi(cParameter[0]);
		x = atoi(cParameter[1]);
		for(j = 0; j < (int)Zoetic->ZoeticHeader.nMagicN; j++)
		{
			if(Zoetic->ZoeticLink[j].dID == i)
				break;
		}
		if(j == (int)Zoetic->ZoeticHeader.nMagicN)
			break;
		Zoetic->face[j] = x;
		FreshTheMap(Map, dMap_StartX, dMap_StartY);
		break;
	case 183:
		if(!IsAgain)
		{
			GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN);
			i = atoi(cParameter[0]);
			m = atoi(cParameter[1]);
			x = atoi(cParameter[2]);
			for(j = 0; j < (int)Zoetic->ZoeticHeader.nMagicN; j++)
			{
				if(Zoetic->ZoeticLink[j].dID == i)
					break;
			}
			if(j == (int)Zoetic->ZoeticHeader.nMagicN)
				break;
			if(x == 9999)
				Fire(j, role->x, role->y, m);
			else
			{
				for(y = 0; y < (int)Zoetic->ZoeticHeader.nMagicN; y++)
				{
					if(Zoetic->ZoeticLink[y].dID == x)
						break;
				}
				if(y == (int)Zoetic->ZoeticHeader.nMagicN)
					break;
				Fire(j, Zoetic->ZoeticLink[y].dCurrent_x, Zoetic->ZoeticLink[y].dCurrent_y, m);
			}
			Pause();
			IsAgain = true;
			if(iScriptID != 0xffff)
			{
				iTimerId = iId;
				SetTimer(hwnd, 9, 50, ScriptTimer);
			}	
			break;
		}
		else if(Zoetic->Waittime[atoi(cParameter[0])] != -1)
		{
			Pause();
			break;
		}
		if(iScriptID != 0xffff)
			KillTimer(hwnd, 9);
		IsAgain = false;
		iExplainResult = -1;
		break;
	case 0xffff:
		break;
	}
}

void CScript::FreshTheMap(CMap	*pMap, long dStartX, long dStartY)
{
	RECT rect;
	rect.left = dStartX;
	rect.top =	dStartY;
	rect.right = rect.left + SW[SMap];
	rect.bottom = rect.top + SH[SMap];
	pMap->ShowMap_Surface(rect, 0, 0);

	rect.left = dStartX%32;
	rect.top = dStartY%32;
	rect.right = rect.left+SCREEN_WIDTH;
	rect.bottom = rect.top+SCREEN_HEIGHT;
		
	FastBlt(0, 0, rect, pS[SBuffer], pS[SMap], SP[SBuffer], SP[SMap], false, 0);
	rect.left = dStartX;
	rect.top =	dStartY;
	rect.bottom = rect.left + SCREEN_WIDTH;
	rect.bottom = rect.top+SCREEN_HEIGHT;
	pMap->ShowMap_Obj(rect, 0, 0);
}

void CALLBACK ScriptTimer(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
{
	Script_Child[iTimerId].Run( );
}

void OpenScriptInit( )
{
	int i;
	FILE *file=fopen("resource\\script\\script.key","rb");

	if(!file)
	{
		MsgBox("不能打开脚本关键字文件!");
		return;
	}

	fread((char *)&ScriptKeyHeader, sizeof(_ScriptKeyHeader), 1, file);
	fread((char *)cScriptText, Max_Script_Key*30*sizeof(char), 1, file);
	fread((char *)cScriptParameter, Max_Script_Key*10*sizeof(char), 1, file);

	fclose(file);
	
	if(parameter == NULL)
	{
		file = fopen("resource\\script\\parameter.pmr", "rb");
		
		if(!file)
		{
			MsgBox("不能打开变量文件!");
			return;
		}

		fread((char *)&ParameterHeader, sizeof(_ScriptParameterHeader), 1, file);	
		fclose(file);
		parameter = (int **) new int[ParameterHeader.nParameterN];
		parameter[0] = &role->level;
		parameter[1] = &role->health;
		parameter[2] = &role->MaxHealth;
		parameter[3] = &role->energy;
		parameter[4] = &role->MaxEnergy;
		parameter[5] = &role->vigor;
		parameter[6] = &role->MaxVigor;
		parameter[7] = &role->speed;
		parameter[8] = &role->v;
		parameter[9] = &role->experiment;
		parameter[10] = &role->MaxExperiment;
		parameter[11] = &role->reputation;
		parameter[12] = &role->character;
		parameter[13] = &role->x;
		parameter[14] = &role->y;
		parameter[15] = &role->face;
		parameter[16] = &role->defend;
		parameter[17] = &role->attack;
		parameter[18] = &role->Waittime;
		for(i = 19; i < (int)ParameterHeader.nParameterN; i++)
		{
			parameter[i] = new int;
		   *parameter[i] = 0;
		}
	}
}